package com.manager.commons.utils;

//			 	     _ooOoo_    
//				    o8888888o    
//				    88" . "88    
//				    (| -_- |)    
//			 	     O\ = /O    
//		         ____/'---'\____    
//	   	        /. '\\| : |//' .\    
//		       // \\||| : |||// \\   
//	          // _|||||-:-|||||_ \\    
//           // | | \\\ - /// | | \\
//           || |_| ''\---/'' |_| || 
//            \ .-\___/'-'\___/-. /    
//          ___\. .' /--.--\ '. ./___    
//        .""'< `.___\_<|>_/___.' >'"".    
//       | |: `- \`.|'\ _ /'|.`/ -` :| |    
//    	  \ \ `-. \_ __\ /__ _/ .-` / /    
//======'-.___`-.___\_______/___.-`___.-'======    
//				     '=---='    
//.................................................    
//写一哈代码，你就青叫唤；信龟儿设计，你逗是傻逼。
//永无Bug，啷个可能！求佛主保佑也没球用！

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import org.slf4j.Logger;

import com.manager.commons.log.LogFactory;

/**
 * ZIPUtil(压缩/解压)
 * @author H
 * @version V1.0
 */
public class ZIPUtil {

	protected static Logger logger = LogFactory.getLogger(ZIPUtil.class);

	/**
	 * 压缩文件
	 * @param srcFiles
	 * @param zipFile
	 */
	public static void zipFiles(File[] srcFiles, File zipFile) {
		try {
			if (srcFiles.length != 0) {
				// 判断压缩后的文件存在不，不存在则创建
				if (!zipFile.exists()) {
					zipFile.createNewFile();
				} else {
					zipFile.delete();
					zipFile.createNewFile();
				}
				// 创建 FileInputStream 对象
				FileInputStream fileInputStream = null;
				// 实例化 FileOutputStream 对象
				FileOutputStream fileOutputStream = new FileOutputStream(zipFile);
				// 实例化 ZipOutputStream 对象
				ZipOutputStream zipOutputStream = new ZipOutputStream(fileOutputStream);
				// 创建 ZipEntry 对象
				ZipEntry zipEntry = null;
				// 遍历源文件数组
				for (int i = 0; i < srcFiles.length; i++) {
					// 将源文件数组中的当前文件读入 FileInputStream 流中
					fileInputStream = new FileInputStream(srcFiles[i]);
					// 实例化 ZipEntry 对象，源文件数组中的当前文件
					zipEntry = new ZipEntry(srcFiles[i].getName());
					zipOutputStream.putNextEntry(zipEntry);
					// 该变量记录每次真正读的字节个数
					int len;
					// 定义每次读取的字节数组
					byte[] buffer = new byte[1024];
					while ((len = fileInputStream.read(buffer)) > 0) {
						zipOutputStream.write(buffer, 0, len);
					}
				}
				zipOutputStream.closeEntry();
				zipOutputStream.close();
				fileInputStream.close();
				fileOutputStream.close();
			}
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
		}
	}

	/**
	 * 将存放在sourceFilePath目录下的源文件，打包成fileName名称的zip文件，并存放到zipFilePath路径下
	 * @param sourceFilePath 待压缩的文件路径
	 * @param zipFilePath    压缩后存放路径
	 * @param fileName       压缩后文件的名称
	 * @return
	 */
	public static boolean fileToZip(String sourceFilePath, String zipFilePath, String fileName) {
		boolean flag = false;
		File sourceFile = new File(sourceFilePath);
		FileInputStream fis = null;
		BufferedInputStream bis = null;
		FileOutputStream fos = null;
		ZipOutputStream zos = null;

		// 目录不存在，新建目录
		if (!sourceFile.exists()) {
			sourceFile.mkdir();
		}
		try {
			File zipFile = new File(zipFilePath + "/" + fileName);
			if (!zipFile.exists()) {
				File[] sourceFiles = sourceFile.listFiles();
				if (null == sourceFiles || sourceFiles.length < 1) {
					// System.out.println("待压缩的文件目录：" + sourceFilePath + "里面不存在文件，无需压缩.");
					logger.info("待压缩的文件目录：" + sourceFilePath + "里面不存在文件，无需压缩.");
				} else {
					fos = new FileOutputStream(zipFile);
					zos = new ZipOutputStream(new BufferedOutputStream(fos));
					byte[] bufs = new byte[1024 * 10];
					for (int i = 0; i < sourceFiles.length; i++) {
						// 创建ZIP实体，并添加进压缩包
						ZipEntry zipEntry = new ZipEntry(sourceFiles[i].getName());
						zos.putNextEntry(zipEntry);
						// 读取待压缩的文件并写进压缩包里
						fis = new FileInputStream(sourceFiles[i]);
						bis = new BufferedInputStream(fis, 1024 * 10);
						int read = 0;
						while ((read = bis.read(bufs, 0, 1024 * 10)) != -1) {
							zos.write(bufs, 0, read);
						}
					}
					flag = true;
				}
			}
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
			throw new RuntimeException(e);
		} finally {
			// 关闭流
			try {
				if (null != bis)
					bis.close();
				if (null != zos)
					zos.close();
			} catch (IOException e) {
				logger.error(e.getMessage(), e);
				throw new RuntimeException(e);
			}
		}
		return flag;
	}
}